Add an option to disable F16C
authorMatthias Clasen <mclasen@redhat.com>
Wed, 7 Apr 2021 23:41:54 +0000 (19:41 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Thu, 8 Apr 2021 02:21:23 +0000 (22:21 -0400)
And add a compile time check for the presence of this
CPU feature.

config.h.meson
gsk/meson.build
gsk/ngl/fp16private.h
meson.build
meson_options.txt

index 549a6773791c6756bfcd77327d3fc264d4c48475..fc2dd0b3d210fc8b9115c3a740992b9b5f01d45c 100644 (file)
 
 /* Define if tracker3 is available */
 #mesondefine HAVE_TRACKER3
+
+#mesondefine HAVE_F16C
index 11be6a03f62b88d1c855d99ae6688a22179af4b6..5c381b51c9b6b22cbe9fe9c7ca30b8273fcc740a 100644 (file)
@@ -221,7 +221,6 @@ libgsk = static_library('gsk',
     '-DGTK_COMPILATION',
     '-DG_LOG_DOMAIN="Gsk"',
     '-DG_LOG_STRUCTURED=1',
-    '-mf16c'
   ] + common_cflags,
   link_with: libgdk,
 )
index f54f7307a63931bdc2a7cb6dc84483ad5e2a1145..2bc9f84eea0699cf19c663863ba1ff626e54f7e8 100644 (file)
@@ -1,4 +1,4 @@
-/* ninesliceprivate.h
+/* fp16private.h
  *
  * Copyright 2021 Red Hat, Inc.
  *
 #ifndef __FP16_PRIVATE_H__
 #define __FP16_PRIVATE_H__
 
+#include <config.h>
 #include <glib.h>
 #include <graphene.h>
 
-#ifdef GRAPHENE_USE_SSE
+#ifdef HAVE_F16C
 #include <immintrin.h>
 #endif
 
@@ -34,7 +35,7 @@ G_BEGIN_DECLS
 #define FP16_ONE ((guint16)15360)
 #define FP16_MINUS_ONE ((guint16)48128)
 
-#ifdef GRAPHENE_USE_SSE
+#ifdef HAVE_F16C
 
 static inline void
 float_to_half4 (const float f[4],
@@ -54,7 +55,7 @@ half_to_float4 (const guint16 h[4],
   _mm_store_ps (f, s);
 }
 
-#else  /* GRAPHENE_USE_SSE */
+#else  /* GTK_HAS_F16C */
 
 static inline guint
 as_uint (const float x)
@@ -108,7 +109,7 @@ half_to_float4 (const guint16 h[4],
   f[3] = half_to_float (h[3]);
 }
 
-#endif  /* GRAPHENE_USE_SSE */
+#endif  /* HAVE_F16C */
 
 G_END_DECLS
 
index 38d23ed61cd3925868b1bdc98a51a50ed6094043..c9586acc29339298dcf8b6934740f5a00b75a648 100644 (file)
@@ -685,6 +685,42 @@ if graphene_has_sse2 or graphene_has_gcc
   endif
 endif
 
+f16c_cflags = []
+if get_option('f16c').enabled()
+  f16c_prog = '''
+#if defined(__GNUC__)
+# if !defined(__amd64__) && !defined(__x86_64__)
+#   error "F16C intrinsics are only available on x86_64"
+# endif
+#elif defined (_MSC_VER) && !defined (_M_X64) && !defined (_M_AMD64)
+# error "F16C intrinsics not supported on x86 MSVC builds"
+#endif
+#if defined(__SSE__) || (_M_X64 > 0)
+# include <immintrin.h>
+#else
+# error "No F16C intrinsics available"
+#endif
+int main () {
+  float f[4] = { 0, };
+  unsigned short h[4] = { 0, };
+  __m128 s = _mm_loadu_ps (f);
+  __m128i i = _mm_cvtps_ph (s, 0);
+  _mm_storel_epi64 ((__m128i*)h, i);
+    return 0;
+}'''
+  if cc.get_id() != 'msvc'
+    test_f16c_cflags = [ '-mf16c' ]
+  else
+    test_f16c_cflags = []
+  endif
+
+  if cc.compiles(f16c_prog, args: test_f16c_cflags, name: 'F16C intrinsics')
+    cdata.set('HAVE_F16C', 1)
+    f16c_cflags = test_f16c_cflags
+    common_cflags += test_f16c_cflags
+  endif
+endif
+
 subdir('gtk/css')
 subdir('gdk')
 subdir('gsk')
index 16a1cbd9fed82edd3609dfe14cb871420f140c41..4193415151a8e1053787ab270601a0ffb5307385 100644 (file)
@@ -86,6 +86,11 @@ option('sassc',
        value: 'auto',
        description: 'Rebuild themes using sassc')
 
+option('f16c',
+       type: 'feature',
+       value: 'enabled',
+       description: 'Enable F16C fast paths (requires F16C)')
+
 # Documentation and introspection
 
 option('gtk_doc',